package com.fwtai.tool;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

import java.util.HashMap;

/**
 * 阿里短信通知
 * @作者 田应平
 * @版本 v1.0
 * @创建时间 2021-07-15 11:31
 * @QQ号码 444141300
 * @Email service@dwlai.com
 * @官网 http://www.fwtai.com
*/
public final class ToolSms{

  private ToolSms(){}

  private final static String signName = "酱中古酒";//贵州酱中古酒供应链管理

  //产品名称:云通信短信API产品,开发者无需替换
  static final String product = "Dysmsapi";
  //产品域名,开发者无需替换
  static final String domain = "dysmsapi.aliyuncs.com";

  static final String accessKeyId = "LTAI5tHQYkAiQbHsiP8rjdfD";
  static final String accessKeySecret = "snlJlW5RkKaaUKMIUVhFQTilyyRG0R";

  //注册或登录验证码,在集群负载均衡时有问题
  public static boolean sendSms(final String phone,final String code){
    return send(phone,"code",code,"SMS_295265668");
  }

  /**
   * 发送短信
   * @param phoneNumber 接收短信的手机号码
   * @param templateCode 模板CODE
   * @param keyValue 其中的key是模板里的变量,即验证码的code就是变量,value就是变量的值
   * @作者 田应平
   * @QQ 444141300
   * @创建时间 2022/11/9 21:13
  */
  private static boolean send(final String phoneNumber,final String templateCode,final HashMap<String,Object> keyValue){
    try {
      //可自助调整超时时间
      System.setProperty("sun.net.client.defaultConnectTimeout","10000");
      System.setProperty("sun.net.client.defaultReadTimeout","10000");
      //初始化acsClient,暂不支持region化
      final IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",accessKeyId,accessKeySecret);
      DefaultProfile.addEndpoint("cn-hangzhou","cn-hangzhou",product,domain);
      final IAcsClient acsClient = new DefaultAcsClient(profile);
      //组装请求对象-具体描述见控制台-文档部分内容
      final SendSmsRequest request = new SendSmsRequest();
      //必填:待发送手机号
      request.setPhoneNumbers(phoneNumber);
      //必填:短信签名-可在短信控制台中找到
      request.setSignName(signName);
      //必填:短信模板-可在短信控制台中找到
      request.setTemplateCode(templateCode);
      //选填:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
      if(keyValue != null && keyValue.size() >0){
        final StringBuilder json = new StringBuilder("{");
        for(final String key : keyValue.keySet()){
          if(json.length() > 1){
            json.append(",").append("\"").append(key).append("\":\"").append(keyValue.get(key)).append("\"");
          }else{
            json.append("\"").append(key).append("\"").append(":\"").append(keyValue.get(key)).append("\"");
          }
        }
        json.append("}");
        request.setTemplateParam(json.toString());
      }
      acsClient.getAcsResponse(request);
      return true;
    } catch (final Exception e) {
      e.printStackTrace();
      return false;
    }
  }

  /**
   * 封装发送短信
   * @param phoneNumber 接收短信的手机号码
   * @param variate sms模板里的变量名
   * @param value sms模板里的变量名对应的值
   * @param templateCode sms模板CODE
   * @作者 田应平
   * @QQ 444141300
   * @创建时间 2024/2/26 16:21
  */
  public static boolean send(final String phoneNumber,final String variate,final String value,final String templateCode){
    final HashMap<String,Object> keyValue = new HashMap<>(1);
    keyValue.put(variate,value);
    return send(phoneNumber,templateCode,keyValue);
  }

  /**
   * 指定手机号码发送短信
   * @param phoneNumbers 接收的手机号码
   * @param variate 变量名称
   * @param value 变量名赋值
   * @param templateCode 模板编码编号
   * @作者 田应平
   * @QQ 444141300
   * @创建时间 2021/11/12 13:33
   * @官网 <url>http://www.fwtai.com</url>
  */
  public static boolean dispatch(final String phoneNumbers,final String variate,final String value,final String templateCode){
    return send(phoneNumbers,variate,value,templateCode);
  }
}